package org.jabref.gui.groups;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import org.jabref.gui.StateManager;
import org.jabref.gui.util.CurrentThreadTaskExecutor;
import org.jabref.gui.util.TaskExecutor;
import org.jabref.model.database.BibDatabaseContext;
import org.jabref.model.entry.BibEntry;
import org.jabref.model.groups.AbstractGroup;
import org.jabref.model.groups.AutomaticKeywordGroup;
import org.jabref.model.groups.GroupHierarchyType;
import org.jabref.model.groups.GroupTreeNode;
import org.jabref.model.groups.WordKeywordGroup;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class GroupNodeViewModelTest {
private StateManager stateManager;
private BibDatabaseContext databaseContext;
private GroupNodeViewModel viewModel;
private TaskExecutor taskExecutor;
@Before
public void setUp() throws Exception {
stateManager = mock(StateManager.class);
when(stateManager.getSelectedEntries()).thenReturn(FXCollections.emptyObservableList());
databaseContext = new BibDatabaseContext();
taskExecutor = new CurrentThreadTaskExecutor();
viewModel = getViewModelForGroup(
new WordKeywordGroup("Test group", GroupHierarchyType.INDEPENDENT, "test", "search", true, ',', false));
}
@Test
public void getDisplayNameConvertsLatexToUnicode() throws Exception {
GroupNodeViewModel viewModel = getViewModelForGroup(
new WordKeywordGroup("\\beta", GroupHierarchyType.INDEPENDENT, "test", "search", true, ',', false));
assertEquals("β", viewModel.getDisplayName());
}
@Test
public void alwaysMatchedByEmptySearchString() throws Exception {
assertTrue(viewModel.isMatchedBy(""));
}
@Test
public void isMatchedIfContainsPartOfSearchString() throws Exception {
assertTrue(viewModel.isMatchedBy("est"));
}
@Test
public void treeOfAutomaticKeywordGroupIsCombined() throws Exception {
BibEntry entryOne = new BibEntry().withField("keywords", "A > B > B1, A > C");
BibEntry entryTwo = new BibEntry().withField("keywords", "A > D, E");
BibEntry entryThree = new BibEntry().withField("keywords", "A > B > B2");
databaseContext.getDatabase().insertEntries(entryOne, entryTwo, entryThree);
AutomaticKeywordGroup group = new AutomaticKeywordGroup("Keywords", GroupHierarchyType.INDEPENDENT, "keywords", ',', '>');
GroupNodeViewModel groupViewModel = getViewModelForGroup(group);
WordKeywordGroup expectedGroupA = new WordKeywordGroup("A", GroupHierarchyType.INCLUDING, "keywords", "A", true, ',', true);
WordKeywordGroup expectedGroupB = new WordKeywordGroup("B", GroupHierarchyType.INCLUDING, "keywords", "A > B", true, ',', true);
WordKeywordGroup expectedGroupB1 = new WordKeywordGroup("B1", GroupHierarchyType.INCLUDING, "keywords", "A > B > B1", true, ',', true);
WordKeywordGroup expectedGroupB2 = new WordKeywordGroup("B2", GroupHierarchyType.INCLUDING, "keywords", "A > B > B2", true, ',', true);
WordKeywordGroup expectedGroupC = new WordKeywordGroup("C", GroupHierarchyType.INCLUDING, "keywords", "A > C", true, ',', true);
WordKeywordGroup expectedGroupD = new WordKeywordGroup("D", GroupHierarchyType.INCLUDING, "keywords", "A > D", true, ',', true);
WordKeywordGroup expectedGroupE = new WordKeywordGroup("E", GroupHierarchyType.INCLUDING, "keywords", "E", true, ',', true);
GroupNodeViewModel expectedA = getViewModelForGroup(expectedGroupA);
GroupTreeNode expectedB = expectedA.addSubgroup(expectedGroupB);
expectedB.addSubgroup(expectedGroupB1);
expectedB.addSubgroup(expectedGroupB2);
expectedA.addSubgroup(expectedGroupC);
expectedA.addSubgroup(expectedGroupD);
GroupNodeViewModel expectedE = getViewModelForGroup(expectedGroupE);
ObservableList<GroupNodeViewModel> expected = FXCollections.observableArrayList(expectedA, expectedE);
assertEquals(expected, groupViewModel.getChildren());
}
private GroupNodeViewModel getViewModelForGroup(AbstractGroup group) {
return new GroupNodeViewModel(databaseContext, stateManager, taskExecutor, group);
}
}